package gomz.pres.question;

import gomz.GlobalRes;
import gomz.pres.ModelMain;
import gomz.res.Category;
import gomz.res.Question;
import gomz.res.QuestionCore;

import java.util.ArrayList;

/**
 * Diese Klasse verwaltet die Inhalte fuer das UI GUIMain und beinhaltet deren Logik
 * @author Murillo
 *
 */
public class MQuestion extends ModelMain{
	// ********************************************************************************
	// Variablen
	// ********************************************************************************
	
	// ********************************************************************************
	// Getter/Setter
	// ********************************************************************************

	// ********************************************************************************
	// Konstruktor
	// ********************************************************************************
	/**
	 * Konstruktor fuer das Model der Fragestellung
	 */
	public MQuestion(){
		loadData();
	}
		
	// ********************************************************************************
	// Methoden
	// ********************************************************************************
	/**
	 * Diese Methode hohlt Listen mit allen Kategegorien und den Fragen sowie Ids der Fragestellungen
	 * @return Boolean ob die Daten abgerufen werden konnten
	 */
	public boolean loadData(){
		boolean re = true;
		
		//Alle Kategorien
		categories = con.catGet(); 
		if (categories == null){
			re = false;
			categories = new ArrayList<Category>();
		}
		
		//Alle Haupdaten der Fragestellung die zuer Auswahl benoetigt werden
		questionCoresAll = con.questionCoreGet();
		if(questionCoresAll == null){
			re = false;
			questionCoresAll = new ArrayList<QuestionCore>();
			questionCoresUsed = questionCoresAll;
		}
		
		return (re);
	}

	
	/**
	 * Diese Methode gibt alle Fragen zurueck die den mitgegeben Text im Titel haben
	 * @param qTitle Suchbegriff der im Titel einer Frage vorkommen soll
	 * @return ArrayList<QuestionCore> Liste mit allen Fragen die gefunden wurden
	 */
	public ArrayList<QuestionCore> search(String qTitle){
		ArrayList<QuestionCore> searchRes = new ArrayList<QuestionCore>();
		for(QuestionCore qc : questionCoresAll){			
			if (qc.getTitle().toUpperCase().contains(qTitle.toUpperCase())){
				searchRes.add(qc);
			}
		}
		return (searchRes);
	}
	
	/**
	 * Diese Methode stellt eine neue Fragestellung zur verfuegung
	 */
	public void newQuestion(){
		setQuestion(new Question());
		getQuestion().setUser(GlobalRes.getActivUser());
	}
	

	
	/**
	 * Diese Methode loescht die Fragestellung aus der aus der Datenbank.
	 * @param id Die ID der zu loeschenden Fragestellung
	 * @return Boolean ob Loeschung erfolgreich
	 */
	public boolean deleteQuestion(int indexToDel){
		QuestionCore qToDel = questionCoresUsed.get(indexToDel);
		boolean re = con.questionDelete(qToDel.getId());
		if(re){
			questionCoresAll.remove(qToDel);
		}
			
		return (re);
	}
        
         /**
	 * Diese Methode speichert die Aenderungen in der Fragestellung in der Datenbank, beziehungsweise erstellt die
	 * Fragestellung in der Datenkbank, falls sie noch nicht vorhanen ist.
	 * @param categories Die ausgewaehlten Kategorien
	 * @param isPublic Boolean ob die Fragestellung oeffentlich angezeigt wird
	 * @param title Titel der Fragestellung
	 * @param question Die Frage
	 * @param analysis Analyse der rage
	 * @param feedback Feedback zuer Frage
	 * @param lines Die angegeben Linien
	 * @return Boolean ob die Aktion durchgefuehrt werden konnte
	 */
	public Boolean saveQuestion(ArrayList<Category> categories, Boolean isPublic, String title, String question, String analysis, String synthesis, String feedback, int[]lines){
		boolean re = false;
		Question qToSave = new Question();
		
		//Daten aus UI hohlen
		if (getQuestion() != null)	qToSave.setId(getQuestion().getId());
		qToSave.setCat(categories);
		qToSave.setIsPublic(isPublic);
		qToSave.setTitle(title);
		qToSave.setQuestion(question);
		qToSave.setAnalysis(analysis);
		qToSave.setSynthesis(synthesis);
		qToSave.setFeedback(feedback);
		qToSave.setLines(lines);
		
		//Fragestellung speichern
		Question reQ = con.questionSave(qToSave);
		if (reQ == null){
			re = false;
		}
		else{
			re=true;
			//interne Fragestellung neu setzten (mit id 0)
			setQuestion(reQ);
			if (questionCoresAll != null){
				boolean exists = false;
				//Fall die Fragestellung schon in der internen Liste der Fragestellungen ist wird diese editiert,
				//ansonsten wird eine neue hinzugefuegt.
				for(QuestionCore qc : this.questionCoresAll){
					if (qc.getId() == reQ.getId()){
						exists = true;
						questionCoresAll.set(questionCoresAll.indexOf(qc), reQ);
						break;
					}
				}
				if (!exists)	this.questionCoresAll.add(0, reQ);
			}
		}
		return(re);
	}
	
	
	public boolean saveHexagram(){
		//Hexagramm speichern, aber Originaltext unberuehrt lassen
		return (con.hexagramSave(getHexagram(), false));
	}
}
